package com.sparrow.common.util;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.RuntimeMXBean;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
import java.util.Arrays;

/**
 * 运行时工具类，用于判断当前操作系统的类型以及获取系统资源信息。
 */
public class RunTimeUtil {

    // 获取当前操作系统名称，并转换为小写
    private static final String OS_NAME = System.getProperty("os.name").toLowerCase();

    // 定义常见操作系统的名称常量
    private static final String WINDOWS = "windows";
    private static final String LINUX = "linux";
    private static final String MAC_OS = "mac os";

    /**
     * 判断当前操作系统是否为 Windows。
     *
     * @return 如果是 Windows 操作系统返回 true，否则返回 false
     */
    public static boolean isWindows() {
        return OS_NAME.contains(WINDOWS);
    }

    /**
     * 判断当前操作系统是否为 Linux。
     *
     * @return 如果是 Linux 操作系统返回 true，否则返回 false
     */
    public static boolean isLinux() {
        return OS_NAME.contains(LINUX);
    }

    /**
     * 判断当前操作系统是否为 macOS。
     *
     * @return 如果是 macOS 操作系统返回 true，否则返回 false
     */
    public static boolean isMacOS() {
        return OS_NAME.contains(MAC_OS);
    }

    /**
     * 获取 JVM 已使用的内存大小（字节）。
     *
     * @return 已使用的内存大小
     */
    public static long getUsedMemory() {
        return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
    }

    /**
     * 获取 JVM 最大可用内存大小（字节）。
     *
     * @return 最大可用内存大小
     */
    public static long getMaxMemory() {
        return Runtime.getRuntime().maxMemory();
    }

    /**
     * 获取系统的 CPU 核心数。
     *
     * @return CPU 核心数
     */
    public static int getCpuCores() {
        return Runtime.getRuntime().availableProcessors();
    }

    /**
     * 获取系统的 CPU 负载。
     *
     * @return CPU 负载，如果不可用则返回 -1
     */
    public static double getSystemCpuLoad() {
        OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
        return osBean.getSystemLoadAverage();
    }

    /**
     * 获取当前 JVM 的线程数。
     *
     * @return 线程数
     */
    public static int getThreadCount() {
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        return threadMXBean.getThreadCount();
    }

    /**
     * 获取所有线程的堆栈信息。
     *
     * @return 包含所有线程堆栈信息的字符串
     */
    public static String getAllThreadStackTraces() {
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(true, true);
        StringBuilder stackTraces = new StringBuilder();
        for (ThreadInfo threadInfo : threadInfos) {
            stackTraces.append(threadInfo.toString());
        }
        return stackTraces.toString();
    }

    public static void runBat(String batPath) {
        try {
            // 执行 bat 脚本
            ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", batPath);
            builder.redirectErrorStream(true); // 合并错误输出

            Process process = builder.start();
            // 读取脚本输出
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"))) { // bat 默认编码一般是GBK
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
            }

            int exitCode = process.waitFor(); // 等待脚本执行完毕
            System.out.println("Bat执行完成，退出码：" + exitCode);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 主方法，用于测试操作系统判断和系统资源信息获取功能。
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        System.out.println("当前操作系统名称: " + OS_NAME);
        System.out.println("是否为 Windows 操作系统: " + isWindows());
        System.out.println("是否为 Linux 操作系统: " + isLinux());
        System.out.println("是否为 macOS 操作系统: " + isMacOS());

        System.out.println("JVM 已使用的内存大小: " + getUsedMemory() + " 字节");
        System.out.println("JVM 最大可用内存大小: " + getMaxMemory() + " 字节");
        System.out.println("系统的 CPU 核心数: " + getCpuCores());
        System.out.println("系统的 CPU 负载: " + getSystemCpuLoad());
        System.out.println("当前 JVM 的线程数: " + getThreadCount());
        System.out.println("所有线程的堆栈信息: \n" + getAllThreadStackTraces());
    }
}